/**
  ******************************************************************************
  * @file    mfrc522.h
  * @author  MCD Application Team
  * @brief   header of mfrc522.c file
	* Change Logs:
	* Date           Author			Notes
	* 2025-06-12     tokamak		Modify format
  */

#ifndef __MFRC522_H
#define __MFRC522_H


#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stdint.h"
#include "stddef.h"
#include <rtthread.h>
#include "stm32g0xx_hal.h"
/* Private includes ----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
#ifndef MFRC522_H
#define MFRC522_H

#include <rtthread.h>

// MFRC522寄存器定义
typedef enum
{
	MFRC522_REG_COMMAND       = 0x01,  // 命令寄存器
	MFRC522_REG_ERROR          = 0x06,  // 错误寄存器（新增）
	MFRC522_REG_STATUS1        = 0x07,  // 状态寄存器1（新增）
	MFRC522_REG_STATUS2        = 0x08,  // 状态寄存器2（新增）
	MFRC522_REG_FIFO_DATA     = 0x09,  // FIFO数据寄存器
	MFRC522_REG_FIFO_LEVEL    = 0x0A,  // FIFO级别寄存器
	MFRC522_REG_CONTROL       = 0x0C,  // 控制寄存器
	MFRC522_REG_BIT_FRAMING   = 0x0D,  // 位帧寄存器
	MFRC522_REG_COLLISION     = 0x0E,  // 冲突寄存器
	MFRC522_REG_MODE          = 0x11,  // 模式寄存器
	MFRC522_REG_TX_CONTROL    = 0x14,  // 发送控制寄存器
	MFRC522_REG_RF_CFG        = 0x26,  // RF配置寄存器
	MFRC522_REG_GS_N          = 0x27,  // GsN寄存器
	MFRC522_REG_CW_GS_P       = 0x28,  // CWGsP寄存器
	MFRC522_REG_MOD_GS_P      = 0x29,  // ModGsP寄存器
	MFRC522_REG_T_MODE        = 0x2A,  // 定时器模式寄存器
	MFRC522_REG_T_PRESCALER   = 0x2B,  // 定时器预分频器
	MFRC522_REG_T_RELOAD_H    = 0x2C,  // 定时器重载值高字节
	MFRC522_REG_T_RELOAD_L    = 0x2D,  // 定时器重载值低字节
	MFRC522_REG_VERSION       = 0x37   // 版本寄存器
} MFRC522_Register;

// 命令集
typedef enum
{
	MFRC522_CMD_IDLE          = 0x00,
	MFRC522_CMD_MEM           = 0x01,
	MFRC522_CMD_GEN_RANDOM    = 0x02,
	MFRC522_CMD_CALC_CRC      = 0x03,
	MFRC522_CMD_TRANSMIT      = 0x04,
	MFRC522_CMD_NO_CMD_CHANGE = 0x07,
	MFRC522_CMD_RECEIVE       = 0x08,
	MFRC522_CMD_TRANSCEIVE    = 0x0C,
	MFRC522_CMD_MF_AUTHENT    = 0x0E,
	MFRC522_CMD_SOFT_RESET    = 0x0F
} MFRC522_Command;

// 卡片类型
typedef enum
{
	PICC_TYPE_UNKNOWN,
	PICC_TYPE_MIFARE_1K
} MFRC522_PiccType;

// 状态码
typedef enum
{
	STATUS_OK,
	STATUS_ERROR,
	STATUS_COLLISION,
	STATUS_TIMEOUT,
	STATUS_NO_ROOM,
	STATUS_INTERNAL_ERROR
} MFRC522_Status;

// MFRC522设备结构体
typedef struct
{
	struct rt_i2c_bus_device* i2c_bus; // I2C总线设备
	uint8_t i2c_addr;                  // I2C设备地址
	rt_base_t rst_pin;                 // 复位引脚
	rt_base_t irq_pin;                 // 中断引脚(可选)
	char name[RT_NAME_MAX];            // 设备名称
	rt_list_t list;                    // 设备链表节点
} mfrc522_device;

// UID结构
typedef struct
{
	uint8_t size;
	uint8_t uid[10];
} MFRC522_Uid;


#endif /* MFRC522_H */
/* Exported variables prototypes ---------------------------------------------*/
/* Exported functions prototypes ---------------------------------------------*/
/**
 * 初始化MFRC522设备
 *
 * @param dev MFRC522设备指针
 * @param i2c_bus_name I2C总线名称
 * @param i2c_addr I2C设备地址
 * @param rst_pin 复位引脚号
 * @param name 设备名称
 *
 * @return RT_EOK 成功, 其他 失败
 */
rt_err_t mfrc522_init(mfrc522_device* dev, const char* i2c_bus_name,
                      uint8_t i2c_addr, rt_base_t rst_pin, const char* name);

/**
 * 通过名称查找MFRC522设备
 *
 * @param name 设备名称
 *
 * @return MFRC522设备指针
 */
mfrc522_device* mfrc522_find(const char* name);

/**
 * 向寄存器写入数据
 *
 * @param dev MFRC522设备
 * @param reg 寄存器地址
 * @param data 要写入的数据
 */
void mfrc522_write_reg(mfrc522_device* dev, MFRC522_Register reg, uint8_t data);

/**
 * 从寄存器读取数据
 *
 * @param dev MFRC522设备
 * @param reg 寄存器地址
 *
 * @return 读取到的数据
 */
uint8_t mfrc522_read_reg(mfrc522_device* dev, MFRC522_Register reg);

/**
 * 检测是否有新卡片
 *
 * @param dev MFRC522设备
 *
 * @return RT_TRUE 检测到卡片, RT_FALSE 未检测到
 */
rt_bool_t mfrc522_detect_card(mfrc522_device* dev);

/**
 * 读取卡片UID
 *
 * @param dev MFRC522设备
 * @param uid 用于存储UID的结构体
 *
 * @return STATUS_OK 成功, 其他 失败
 */
MFRC522_Status mfrc522_read_uid(mfrc522_device* dev, MFRC522_Uid* uid);

/**
 * 执行软复位
 *
 * @param dev MFRC522设备
 */
void mfrc522_soft_reset(mfrc522_device* dev);

/* ---------------------------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif /* __MFRC522_H */

/*********************************END OF FILE***********************************/

